/****************************************************************************
 This is my private libary!------------THE ARCHIEVE FILE
 AUTHOR: sangay
 DATE: 2/14/2012
*****************************************************************************/

#include<stdio.h>
#include<string.h>
#include<ctype.h>

static char charset[]={ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', /*10*/
                        'a', 'b', 'c', 'd', 'e', 'f', 'g', /* 17 */
                        'h', 'i', 'j', 'k', 'l', 'm', 'n', /* 24 */
                        'o', 'p', 'q', 'r', 's', 't',  /* 30 */
                        'u', 'v', 'w', 'x', 'y', 'z', /* 36 */
                        'A', 'B', 'C', 'D', 'E', 'F', 'G', /* 43 */
                        'H', 'I', 'J', 'k', 'L', 'M', 'N', /* 50 */
                        'O', 'P', 'Q', 'R', 'S', 'T',  /* 56 */
                        'U', 'V', 'W', 'X', 'Y', 'Z' }  /* 62 */
/****************************************************************************
 判断x是否是0到9中的任一个数字.如果是，则返回真（True）；否则，返回假（False）
 ****************************************************************************/
BOOL is_number(x)
{
    return isdigit(x);
}

/****************************************************************************
 判断x是否是1到9中的任一个数字.如果是，则返回真（True）；否则，返回假（False）
 ****************************************************************************/
BOOL is_nozeronum(x)
{
    int i = 1;
    for ( ; i <= 9; ++i){
        if (x == charset[i])
            return True;
    return False;
}

/****************************************************************************
 判断x是否是一个八进制数字.如果是，则返回真（True）；否则，返回假（False）
 ****************************************************************************/
BOOL is_oct(x)
{
    int i = 0;
    for ( ; i <= 7; ++i){
        if (x == charset[i])
            return True;
    return False;
}

/****************************************************************************
 判断x是否是一个十六进制数字.如果是，则返回真（True）；否则，返回假（False）
 ****************************************************************************/
BOOL is_hex(x)
{
    return isxdigit(x);
}

/****************************************************************************
 判断x是否是一个二进制数字.如果是，则返回真（True）；否则，返回假（False）
 ****************************************************************************/
BOOL is_bin(x)
{
    if ((x == '0') || (x == '1'))
        return True;
    else
        return False;
}

/****************************************************************************
 判断x是否是a到z的任一小写字母.如果是，则返回真（True）；否则，返回假（False）
 ****************************************************************************/
BOOL is_atoz(x)
{
    int i = 10;
    for ( ; i <= 35; ++i){
        if (x == charset[i])
            return True;
    return False;
}

/****************************************************************************
 判断x是否是A到Z的任一大写字母.如果是，则返回真（True）；否则，返回假（False）
 ****************************************************************************/
BOOL is_AtoZ(x)
{
    int i = 36;
    for ( ; i <= 61; ++i){
        if (x == charset[i])
            return True;
    return False;
}

/****************************************************************************
 判断x是否是a到z或A到Z的任一大小写字母。
 如果是，则返回真（True）；否则，返回假（False）
 ****************************************************************************/
BOOL is_atoZ(x)
{
    int i = 10;
    for ( ; i <= 61; ++i){
        if (x == charset[i])
            return True;
    return False;
}

/****************************************************************************
 判断x是否是0到9的任一数字，或者a到z的任一小写字母，或者A到Z的任一大写字母。
 如果是，则返回真（True）；否则，返回假（False）。
 ****************************************************************************/
BOOL is_alnum(x)
{
    int i = 0;
    for ( ; i <= 61; ++i){
        if (x == charset[i])
            return True;
    return False;
}

/****************************************************************************
 判断x是否是空格或水平制表符.如果是，则返回真（True）；否则，返回假（False）
 ****************************************************************************/
BOOL is_blank(x)
{
    if ((y == ' ') || (y == '\t'))
        return True;
    else
        return False;
}

/****************************************************************************
 判断x是否是回车符.如果是，则返回真（True）；否则，返回假（False）
 ****************************************************************************/
BOOL is_enter(x)
{
    if (x == '\r')
        return True;
    else
        return False;
}

/****************************************************************************
 判断x是否是换行符.如果是，则返回真（True）；否则，返回假（False）
 ****************************************************************************/
BOOL is_newline(x)
{
    if (x == '\n')
        return True;
    else
        return False;
}


/*****************************************************************************
  本函数是标准函数库<stdio.h>中的fgetc函数的增强版本。
  本函数从流stream中只读取第一个字符，然后把剩余的所有字符（包括  换行符）
  全部丢掉，接着刷新stream流缓冲区。
 *****************************************************************************/
int enfgetc(FILE *stream)
{
    int rtn = fgetc(stream);
    int tmp = 0;
    while (!is_newline((tmp = fgetc(stream))) && !is_enter(tmp));
    fflush(stream);
    return rtn;
}


/*****************************************************************************
  本函数是标准函数库<stdio.h>中的fgets函数的增强版本。
  本函数的语义与fgets的语义相同，除了永远也不会保存换行符，即当输入是由于遇到
  换行符而终止时，这个换行符被丢弃，而不会存储在要保存的数组中，也不会停留在
  缓冲区中。
 *****************************************************************************/
char * enfgets(char * buffer, int n, FILE *stream)
{
    char * rtn = fgets(buffer, n, stream);
    if (rtn == NULL && !feof(stream)){
        return rtn;
    }else{
        int count = strlen(buffer);
        if (is_newline(buffer[count - 1])){
            buffer[count - 1] = NULLCHAR;
        }
        return rtn;
    }
}


/*****************************************************************************
  本函数是标准函数库<stdio.h>中的strncpy函数的增强版本。
  本函数的语义与strncpy函数的语义相基本相同。本函数与strncpy的差别：如果src中
  的字符个数大于n，则除了像strncpy一样拷贝前n个字符外，还会在该n个字符后添加
  一个结束符，即实际拷贝了n+1个字符。
 *****************************************************************************/
char * enstrncpy(char *des, const char *src, size_t n)
{
    char * rtn = strncpy(des, src, n);
    des[n] = NULLCHAR;
    return rtn;
}
